importPackage(Packages.java.io);
importPackage(Packages.de.elo.ix.client);
//@include lib_Class.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.ix.ServiceBase.js
var logger = sol.create("sol.Logger", { scope: "sol.common.ix.services.GetConfig" });
/**
* Returns content of a configuration json file that is stored in ELO.
*
* This service is useful if information should be retrieved within external web applications.
*
* # Simple configuration
* This loads a configuration from a single JSON configuration file.
*
* As IX service call
*
* sol.common.IxUtils.execute('RF_sol_common_service_GetConfig', {
* objId: "ARCPATH:/Administration/Business Solutions/pubsec/Configuration/pubsec.Config",
* forceReload: true // optional, if true, the cache will be refreshed
* });
*
* Returns content of the configuration as followed:
*
* {
* config: {
* // config content
* version: '9.00.001',
* ruleSetName: "MY_RULE",
* ...
* }
* }
*
* # Merged configuration
* This loads a merged configuration from a hierarchy of JSON configuration files.
*
* As IX service call
*
* sol.common.IxUtils.execute('RF_sol_common_service_GetMergedConfig', {
* compose: "ARCPATH:/Administration/Business Solutions/pubsec/Configuration/pubsec.Config"
* forceReload: true // optional, if true, the cache will be refreshed
* });
*
* Returns content of the configuration as followed:
*
* {
* config: {
* // config content
* version: '9.00.001',
* ruleSetName: "MY_CUSTOM_RULE",
* ...
* }
* }
*
* # Configuration hierarchy
* This loads all JSON configuration files from the merge hierarchy, without performing the merge.
* By default, this just returns the GUIDs.
*
* As IX service call
*
* sol.common.IxUtils.execute('RF_sol_common_service_GetConfigHierarchy', {
* compose: "/pubsec/Configuration/pubsec.Config",
* content: true //optional, if not set, or none `true` value, only GUIDs will be returned
* forceReload: true // optional, if true, the cache will be refreshed
* });
*
* Returns the hierarchy of the configuration as followed:
*
* {
* defaultConfig: {
* guid: "(3A348D43-2C82-CA21-4812-1A10AB368125)",
* content: { ... } // opional, only returned, if content parameter was `true`
* },
* customConfigs: [
* { guid: "(BA8C4F65-7DFA-5F02-23C1-3680A4E8A94E)", content: { ... } },
* ...
* ]
* }
*
* @author NM, ELO Digital Office GmbH
* @version 1.05.000
*
* @eloix
* @requires sol.common.Config
* @requires sol.common.RepoUtils
* @requires sol.common.ix.ServiceBase
*/
sol.define("sol.common.ix.services.GetConfig", {
extend: "sol.common.ix.ServiceBase",
/**
* @cfg {String} objId (optional) The object id of the configuration (also guid and arcpath allowed). The config will be loaded plain.
*/
/**
* @cfg {String} compose (optional) A relative path inside the 'Business Solutions' (or its 'Custom') folders or even an objId. The config will be loaded composed.
*/
/**
* @since 1.05.000
* @cfg {String[]} paths (optional) an array of relative paths inside the 'Business Solutions' (or its 'Custom') folders or even an objId. The configs will be loaded composed.
*/
/**
* @cfg {Boolean} [hierarchical=false] (optional) If `true` the result will contain all GUIDs of configurations which would be part of the merging. Only works with {@link #compose}.
*/
/**
* @cfg {Boolean} [content=false] (optional) If `true` the hierarchical result will contain the configs themself. Only works with {@link #compose} and {@link #hierarchical}.
*/
/**
* @cfg {Boolean} [forceReload=false] (optional) If `true` cache will be refreshed.
*/
/**
* @cfg {Boolean} [exceptionOnBrokenConfig=false] (optional)
* If `true` there will be an exception, if one of the merged configs has errors.
* The function {@link #RF_sol_common_service_GetMergedConfig} overrides the default value always with `true`, except the call specifies the parameter as `false`.
*/
initialize: function (config) {
var me = this;
if (!config.objId && !config.compose && !config.paths) {
throw "InitializationException: either 'objId', 'compose' or 'paths' has to be defined";
}
me.$super("sol.common.ix.ServiceBase", "initialize", [config]);
},
/**
* Downloads the given file content as string
* @return {Object}
*/
process: function () {
var me = this,
mode, result;
mode = me.determineMode();
switch (mode) {
case "SIMPLE":
result = me.getSimpleConfig();
break;
case "MERGED":
result = me.getMergedConfig();
break;
case "HIERARCHICAL":
result = me.getExplodedConfig(me.compose);
break;
case "MULTI_HIERARCHICAL":
result = me.getMultipleExplodedConfigs();
break;
default:
throw "IllegalStateException: can not determine result mode";
}
return result;
},
/**
* @private
* Determines in which mode the class is executed ("SIMPLE"|"MERGED"|"HIERARCHICAL").
* @return {String}
*/
determineMode: function () {
var me = this;
if (me.objId) {
return "SIMPLE";
}
if (me.compose && (me.hierarchical === true)) {
return "HIERARCHICAL";
}
if (me.paths && (me.hierarchical === true)) {
return "MULTI_HIERARCHICAL";
}
if (me.compose) {
return "MERGED";
}
},
/**
* @private
* Retrieves a simple configuration from an objId
* @return {Object}
*/
getSimpleConfig: function () {
var me = this,
config;
config = sol.create("sol.common.Config", { load: me.objId, forceReload: me.forceReload }).config;
return { config: config };
},
/**
* @private
* Retrieves a merged configuration from an objId or a path
* @return {Object}
*/
getMergedConfig: function () {
var me = this,
config;
config = sol.create("sol.common.Config", { compose: me.compose, forceReload: me.forceReload, exceptionOnBrokenConfig: me.exceptionOnBrokenConfig }).config;
return { config: config };
},
/**
* @private
* Retrieves multiple simple configuration from an objId.
* @return {Object}
*/
getMultipleExplodedConfigs: function () {
var me = this,
result = {};
me.paths.forEach(function (path) {
if (path) {
result[path] = me.getExplodedConfig(path);
}
});
return result;
},
/**
* @private
* Retrieves a simple configuration from an objId
* @param {String} compose
* @return {Object}
*/
getExplodedConfig: function (compose) {
var me = this,
result = {},
cfg, hierarchyObjs;
cfg = sol.create("sol.common.Config", { compose: compose });
if (cfg.validForMergeing()) { // config is in merge hierarchy
hierarchyObjs = cfg.retrieveMergeHierarchy(true);
result.defaultConfig = hierarchyObjs.shift();
if (me.content === true && result.defaultConfig && result.defaultConfig.guid) {
result.defaultConfig.content = sol.create("sol.common.Config", { load: result.defaultConfig.guid, forceReload: me.forceReload }).config;
}
} else { // config is not in merge hierarchy
hierarchyObjs = [{ guid: compose }];
}
if (hierarchyObjs.length > 0) {
result.customConfigs = [];
hierarchyObjs.forEach(function (customObj) {
if (me.content === true && customObj && customObj.guid) {
customObj.content = sol.create("sol.common.Config", { load: customObj.guid, forceReload: me.forceReload }).config;
}
result.customConfigs.push(customObj);
});
}
return result;
}
});
/**
* @member sol.common.ix.services.GetConfig
* @method RF_sol_common_service_GetConfig
* @static
* @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
*/
function RF_sol_common_service_GetConfig(ec, args) {
var params, service, result;
logger.enter("RF_sol_common_service_GetConfig", args);
params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "objId");
service = sol.create("sol.common.ix.services.GetConfig", params);
result = service.process();
logger.exit("RF_sol_common_service_GetConfig", result);
return sol.common.JsonUtils.stringifyAll(result);
}
/**
* @member sol.common.ix.services.GetConfig
* @method RF_sol_common_service_GetMergedConfig
* @static
* @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
*/
function RF_sol_common_service_GetMergedConfig(ec, args) {
var params, service, result;
logger.enter("RF_sol_common_service_GetMergedConfig", args);
if (!args) {
throw "Args are empty";
}
params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "compose");
params.exceptionOnBrokenConfig = (params.exceptionOnBrokenConfig === false) ? false : true;
service = sol.create("sol.common.ix.services.GetConfig", params);
result = service.process();
logger.exit("RF_sol_common_service_GetMergedConfig", result);
return sol.common.JsonUtils.stringifyAll(result);
}
/**
* @member sol.common.ix.services.GetConfig
* @method RF_sol_common_service_GetConfigHierarchy
* @static
* @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
*/
function RF_sol_common_service_GetConfigHierarchy(ec, args) {
var params, service, result;
logger.enter("RF_sol_common_service_GetConfigHierarchy", args);
params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "compose");
params.hierarchical = true;
service = sol.create("sol.common.ix.services.GetConfig", params);
result = service.process();
logger.exit("RF_sol_common_service_GetConfigHierarchy", result);
return sol.common.JsonUtils.stringifyAll(result);
}
/**
* @member sol.common.ix.services.GetConfig
* @method RF_sol_common_service_GetConfigHierarchies
* @since 1.05.000
* @static
* @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
*/
function RF_sol_common_service_GetConfigHierarchies(ec, args) {
var params, service, result;
logger.enter("RF_sol_common_service_GetConfigHierarchies", args);
params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "paths");
params.hierarchical = true;
service = sol.create("sol.common.ix.services.GetConfig", params);
result = service.process();
logger.exit("RF_sol_common_service_GetConfigHierarchies", result);
return sol.common.JsonUtils.stringifyAll(result);
}